package com.ls.fw.mvc.springmvc.base;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;

import com.ls.fw.data.bean.BaseDataEntity;
import com.ls.fw.data.bean.ResultTemplate;
import com.ls.fw.mvc.springmvc.handler.ModelHandler;
import com.ls.fw.mvc.springmvc.util.ViewUtil;
import com.ls.fw.web.core.utils.StringUtil;

/**
 * 实体curd操作基类
 * 
 * @author lisheng
 * @date 2015年9月9日 下午11:04:53
 * @version V1.0
 */
public abstract class BaseCRUDController extends BaseController{
 
//	
//	 /**
//     * 自定义数据绑定注册支持，用于将请求参数转换到命令对象属性的对应类型；
//     * 默认情况下springMVC是不支持m.name这种传参方式,使用initBinder后方可。
//     * @param binder
//     */
//    @InitBinder("m")    
//    public void initBinder(WebDataBinder binder) {    
//        binder.setFieldDefaultPrefix("m.");    
//    }    




	@Autowired(required=false)
	protected ModelHandler modelHandler;
	
	/**
	 * 
	 * @param t
	 * @return
	 */
	public  <M extends BaseDataEntity> M forUpdate(M t){
		if(this.modelHandler!=null){
			return this.modelHandler.forUpdate(t);
		}
		return t;
	}
	
	/**
	 * 
	 * @param t
	 * @return
	 */
	public  <M extends BaseDataEntity> M forAdd(M t){
		if(this.modelHandler!=null){
			return this.modelHandler.forAdd(t);
		}
		return t;
	}
	

	/**
	 * 
	 * @param t
	 * @return
	 */
	public  <M extends BaseDataEntity> M forModel(M t){
		if(this.modelHandler!=null){
			return this.modelHandler.forModel(t);
		}
		return t;
	}
	

	/**
	 * 
	 * @param t
	 * @return
	 */
	public  Object forModel(Object obj){
		if(this.modelHandler!=null){
			return this.modelHandler.forModel(obj);
		}
		return obj;
	} 
	
	/**

	 * 删除数据 (实际删除)

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:49:02

	 * @version V1.0

	 * @param ids (多个id用“,”分割)

	 * @param webRequest

	 * @return

	 */
	public ModelAndView delete(WebRequest webRequest, String ids) throws Exception{
		return null; 
	}
	

	/**

	 * 移除数据 （不实际删除）

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:49:40

	 * @version V1.0

	 * @param ids (多个id用“,”分割)

	 * @param webRequest

	 * @return

	 */
	public ModelAndView remove(WebRequest webRequest, String ids) throws Exception{
		return null;
	}
	

	/**

	 * 添加

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:53:21

	 * @version V1.0

	 * @param model

	 * @param webRequest

	 * @return

	 */
	public <Q> ModelAndView add(WebRequest webRequest, Q model,BindingResult result) throws Exception{
		return null;
	}
	
	/**

	 * 跳转到添加页面

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:56:42

	 * @version V1.0

	 * @param webRequest

	 * @return

	 */
	public ModelAndView toAdd(WebRequest webRequest) throws Exception{
		return null;
	}
	
	/**

	 * 修改

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:53:30

	 * @version V1.0

	 * @param model

	 * @param webRequest

	 * @return

	 */
	public <T>  ModelAndView update(WebRequest webRequest, T model,BindingResult result) throws Exception{
		return null;
	}
	
	
	/**

	 * 跳转到更新页面

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:56:25

	 * @version V1.0

	 * @param model

	 * @param webRequest

	 * @return

	 */
	public ModelAndView toUpdate(WebRequest webRequest, String id) throws Exception{
		return null;
	}
	
	
	/**

	 * 保存

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:53:39

	 * @version V1.0

	 * @param model

	 * @param webRequest

	 * @return

	 */
	public <Q>  ModelAndView save(WebRequest webRequest, Q model,BindingResult result) throws Exception{
		return null;
	}
	
	
	/**

	 * 跳转到编辑页面

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:56:04

	 * @version V1.0

	 * @param id

	 * @param webRequest

	 * @return

	 */
	public ModelAndView toEdit(WebRequest webRequest, String id) throws Exception{
		return null;
	}
	
	
	
	/**

	 * 查询

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午10:53:49

	 * @version V1.0

	 * @param <T>

	 * @param noPage

	 * @param page

	 * @param pageSize

	 * @param model

	 * @param webRequest

	 * @return

	 */
	public <Q> ModelAndView query(WebRequest webRequest, boolean noPage, Integer page
			, Integer pageSize, Q q,BindingResult result) throws Exception{
		return null;
	}
	
	
	/**

	 * 执行删除

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:31:07

	 * @version V1.0

	 * @param ids

	 * @param webRequest

	 * @param viewName

	 * @param mapper

	 * @return

	 * @throws Exception

	 */
	protected ModelAndView doDelete(String ids, WebRequest webRequest
			, String viewName, DeleteWorkHandler mapper) throws Exception{
		String[] idsArray = StringUtil.stringToArray(ids);
		ResultTemplate obj = mapper.doWork(idsArray,webRequest);
		return ViewUtil.convert(this.returnResult(obj, viewName)
				, webRequest,obj.isForceJson());
    }

	protected ModelAndView doDelete(String ids, WebRequest webRequest
			, DeleteWorkHandler mapper) throws Exception{
		return this.doDelete(ids, webRequest, viewPrefix+"/"+DELETE
				, mapper);
	}

	/**

	 * 执行跳转

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:30:59

	 * @version V1.0

	 * @param id

	 * @param webRequest

	 * @param viewName

	 * @param mapper

	 * @return

	 * @throws Exception

	 */
	protected ModelAndView doTo(String id, WebRequest webRequest
			, String viewName, ToWorkHandler mapper ) throws Exception{
		ResultTemplate obj = mapper.doWork(id,webRequest);
		return ViewUtil.convert(this.returnResult(obj, viewName), webRequest
				, obj.isForceJson());
    } 
	 
	/**

	 * 执行保存

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:30:47

	 * @version V1.0

	 * @param model

	 * @param webRequest

	 * @param viewName

	 * @param mapper

	 * @return

	 * @throws Exception

	 */
	protected <Q>  ModelAndView doSave(Q model, WebRequest webRequest
			, String viewName, SaveWorkHandler<Q> mapper) throws Exception{
		ResultTemplate obj = mapper.doWork(model,webRequest);
		return ViewUtil.convert(this.returnResult(obj, viewName)
				, webRequest,obj.isForceJson(),"vo","model");
	}
	
	/**

	 * 执行查询

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:30:35

	 * @version V1.0

	 * @param noPage

	 * @param page

	 * @param pageSize

	 * @param q

	 * @param webRequest

	 * @param viewName

	 * @param mapper

	 * @return

	 * @throws Exception

	 */
	protected <Q>  ModelAndView doQuery(boolean noPage, Integer page
			, Integer pageSize, Q q, WebRequest webRequest
			, String viewName, QueryWorkHandler<Q> mapper) throws Exception{
		ResultTemplate obj = mapper.doWork(noPage, page
				, pageSize, q,webRequest);
		return ViewUtil.convert(this.returnResult(obj, viewName)
				, webRequest,obj.isForceJson(),"q");
	}
	
	protected <Q> ModelAndView doQuery(boolean noPage, Integer page
			, Integer pageSize, Q q, WebRequest webRequest
			,   QueryWorkHandler<Q> mapper) throws Exception{
		return this.doQuery(noPage, page, pageSize, q, webRequest
				, viewPrefix+"/"+QUERY, mapper);
	} 
	
	/**

	 * 删除处理器

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:25:15

	 * @version V1.0

	 */
	public interface DeleteWorkHandler extends WorkHandler{
		
		/**

		 * 执行工作

		 * 

		 * @author lisheng

		 * @date 2015年10月1日 下午3:04:30

		 * @version V1.0

		 * @param ids

		 * @param webRequest

		 * @return

		 * @throws Exception

		 */
		ResultTemplate doWork(String[] ids, WebRequest webRequest) throws Exception;
	}
	

	/**

	 * 跳转处理器

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:23:37

	 * @version V1.0

	 */
	public interface ToWorkHandler extends WorkHandler{
		
		/**

		 * 执行工作

		 * 

		 * @author lisheng

		 * @date 2015年10月1日 下午3:04:52

		 * @version V1.0

		 * @param id

		 * @param webRequest

		 * @return

		 * @throws Exception

		 */
		ResultTemplate doWork(String id, WebRequest webRequest) throws Exception;
	}
	

	/**

	 * 保存处理器

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:24:29

	 * @version V1.0 

	 * @param <T>

	 */
	public interface SaveWorkHandler<T> extends WorkHandler{
		
		
		/**

		 * 执行工作

		 * 

		 * @author lisheng

		 * @date 2015年10月1日 下午3:05:00

		 * @version V1.0

		 * @param model

		 * @param webRequest

		 * @return

		 * @throws Exception

		 */
		ResultTemplate doWork(T model, WebRequest webRequest) throws Exception;
	}
	

	/**

	 * 查询处理器

	 * 

	 * @author lisheng

	 * @date 2015年9月9日 下午11:24:58

	 * @version V1.0 

	 * @param <Q>

	 */
	public interface QueryWorkHandler<Q> extends WorkHandler{
		
		
		/**

		 * 执行工作

		 * @author lisheng

		 * @date 2015年10月1日 下午3:05:06

		 * @version V1.0

		 * @param noPage

		 * @param page

		 * @param pageSize

		 * @param q

		 * @param webRequest

		 * @return

		 * @throws Exception

		 */
		ResultTemplate doWork(boolean noPage, Integer page
				, Integer pageSize, Q q, WebRequest webRequest) throws Exception;
	}
	
		
}